package com.yeban.javase.day20.reflect.singleton;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @Desc 线程安全的单例模式  DCL
 * @Author yeban
 * @Date 2025/11/4
 *
 * 反射获取私有的构造方法，进行实例创建，与当前getInstance()获取的实例不是同一个
 */
public class SingletonDemo2 {

    // 私有的静态的实例
    private static SingletonDemo2 instance;

    // 私有的构造方法
    private SingletonDemo2() {
        // 加锁：阻止反射来构造其他实例
        synchronized (SingletonDemo2.class) {
            if(instance != null) {
                throw new IllegalArgumentException("禁止操作此构造器，已有实例存在！");
            }
        }
    }

    // 公开的 静态的 获取本来实例的方法
    public static SingletonDemo2 getInstance() {
        // Double Check Lock
        if(instance == null) {
            synchronized (SingletonDemo2.class) {
                if (instance == null) {
                    instance = new SingletonDemo2();
                }
            }
        }
        return instance;
    }
}